package modelovectorial.core;

import java.util.StringTokenizer;
import modelovectorial.Palabra;
import soporte.StopWords;
import soporte.WordCleaner;
import utn.frc.tsb.utils.ValerioFritelli.SimpleList.SimpleList;

/**
 * @project DLC Final / UTN FRC 2013
 * @date Febrero de 2013
 *
 * @author Gonzalo Arribere
 * @author Gustavo Morales
 * @author Pablo Moreno
 *
 * Esta clase representa al motor de busqueda que efectua las consultas
 * realizadas por el usuario.
 */
public class SearchEngine {
    // 0.3D 
    // Es el minimo peso esperado de un documento para poder ser procesado por el motor de busqueda.

    public final static double MIN_ACEPTABLE_VALUE = 0;

    /**
     * Procesa una semiconsulta realizada por el usuario y a partir de ella
     * generar sugerencias a la busqueda realizada.
     *
     * @param pQuery semiconsulta realizada por el usuario.
     * @return una lista simple que contiene terminos limpios que conformaran la
     * sugerencia en la pagina de busqueda
     */
    private SimpleList processQuerySuggested(String pQuery) {
        SimpleList query = new SimpleList();
        if (pQuery.substring(pQuery.length() - 1).compareTo(" ") == 0) {
            StringTokenizer strWork = new StringTokenizer(pQuery);
            String queryTerm;

            while (strWork.hasMoreElements()) {
                queryTerm = WordCleaner.clean(strWork.nextToken());

                if (queryTerm.length() >= Palabra.MIN_WORD_LENGTH) {
                    query.addLast(queryTerm);
                }
            }
        }
        return query;
    }

    /**
     * Procesa la consulta efectiva realizada por el usuario y se encarga de
     * limpiar las stop words y signos de puntuacion.
     *
     * @param pQuery cadena que contiene la consulta sin cambios.
     * @return una lista simple con la consulta ya "limpia" es decir sin las
     * stop words y signos.
     */
    private SimpleList processQuery(String pQuery) {
        StringTokenizer strWork = new StringTokenizer(pQuery);
        String queryTerm;
        SimpleList query = new SimpleList();

        while (strWork.hasMoreElements()) {
            queryTerm = WordCleaner.clean(strWork.nextToken());

            if (queryTerm.length() >= Palabra.MIN_WORD_LENGTH && !StopWords.isStopWord(queryTerm)) {
                query.addLast(queryTerm);
            }
        }
        return query;
    }

    /**
     * Realiza la busqueda de los documentos mas relevantes a la consulta
     * relizada y devuelve los extractos de cada una de ellas.
     *
     * @param pQuery Consulta
     * @param pPageNumber Cantidad de paginas a mostrar
     * @return un objeto SearchResult que contiene todos los elementos
     * necesarios para mostrar los resultados en la pagina.
     */
    public SearchResult search(String pQuery, int pPageNumber) {
        SearchResult result = new SearchResult(processQuery(pQuery), pQuery);
        result.compute();
        result.fillDocuments(pPageNumber);
        return result;
    }

    /**
     * Devuelve la sugerencia ofrecida al usuario a partir de la semiconsulta
     * realizada por este.
     *
     * @param pQuery semiconsulta tomada de la pagina.
     * @return un objeto SuggestResult que contiene los elementos necesarios
     * para mostrar en la pagina las sugerencias ofrecidas por el motor.
     */
    public SuggestResult suggest(String pQuery) {
        SuggestResult result = new SuggestResult(processQuerySuggested(pQuery));
        if (result.results() > 0) {
            result.fillDocuments();
        }
        return result;
    }

    /**
     * Se encarga de indexar cada nuevo documento en la base de datos.
     *
     * @param pDirectory cadena que contiene la direccion del directorio donde
     * se ubica el pdf.
     * @param pPdfFile nombre del pdf.
     */
    public void IndexFile(String pDirectory, String pPdfFile) {
        DocumentParser parser = new DocumentParser();
        parser.parseDocument(pDirectory, pPdfFile);
    }
}